package ar.edu.unicen.exa.isistan.archassis.rcs;

import java.util.List;

import ar.edu.unicen.exa.isistan.archassis.DiffRequestData;
import ar.edu.unicen.exa.isistan.archassis.rcs.svn.SVNRevisionControlSystem;

/**
 * Esta interfaz abstrae el tipo de sistema que se utilizará
 * como sistema de control de revisión (Revision Control System).
 * 
 * Implementación usando SVN {@link SVNRevisionControlSystem}
 * 
 * @author Sebastian Perruolo
 *
 */
public interface IRevisionControlSystem {
	
	/**
	 * Este método retorna la lista de todas las versiones que se encuentran
	 * en el repositorio configurado.
	 * 
	 * @return Lista de Versiones.
	 * @throws RCSException En caso de ocurrir un error.
	 */
	List<IVersion> getVersions() throws RCSException;
	
	/**
	 * Este método retorna la última versión existente en el repositorio.
	 * @return la última versión.
	 * @throws RCSException en caso de que falle.
	 */
	IVersion getLastVersion() throws RCSException;
	
	/**
	 * Este método retorna la lista de archivos que sufrieron cambios desde
	 * las versiones que llegan por parámetro.
	 *  
	 * @param v0 Versión inicial.
	 * @param v1 Versión final.
	 * @return Lista de archivos que cambiaron.
	 * @throws RCSException En caso de ocurrir un error.
	 */
	RCSFileDiffList getDiff(IVersion v0, IVersion v1) throws RCSException;
	
	/**
	 * Este método obtiene los archivos indicados en la lista de archivos
	 * cambiados de la versión dada y los almacena en el lugar indicado por 
	 * {@link DiffRequestData#getDestinationFor(IVersion, RCSFileDiff)}.
	 *  
	 * @param v La versión que se quiere obtener
	 * @param items Lista de archivos a obtener
	 * @param tmpFile Directorio donde se almacenarán los archivos.
	 * @throws RCSException En caso de ocurrir un error.
	 */
	void checkOut(IVersion v, List<RCSFileDiff> items, DiffRequestData tmpFile) throws RCSException;
	
	DiffRequestData getDiffRequestData();
}
